package com.cskaoyan.javase.oop2._1extends._3conversion;

/**
 * 基本数据类型能够完成数据类型转换，那么引用数据类型同样具有数据类型转换。
 *
 * 思考以下问题并回答:
 *
 * 1.引用数据类型的变量,要想发生类型转换,大前提是什么?
 *      无论如何转换,大前提都是继承,没有继承
 *      引用数据类型的变量就没有类型转换
 *
 *      继承的优点: 继承的出现,打破了Java引用数据类型的类型限制
 *          正是因为有了继承,引用数据类型的变量才出现了类型转换
 *
 * 2.引用数据类型的变量,类型转换,转换的是什么的类型?
 *      引用数据类型的变量,有引用,有对象,转换的是谁的类型?
 *      转换的是引用的数据类型,一定要注意,对象的类型是不可能转换的
 *      对象只能改变状态,不可能改变类型
 *
 *
 * 3.引用数据类型的类型转换,和基本数据类型一样,也分为两大类:
 *      a.自动类型转换: 程序员无需写额外代码,编译器自动完成类型的转换.
 *      b.强制类型转换: 程序员需要写特殊语法完成类型转换.
 *          语法: 强转后类型的类名 对象名 = (强转后类型的类名)对象名;
 *
 *
 * 4.引用数据类型的自动类型转换:
 *      条件/什么情况下发生:
 *          子类引用 转换成 父类引用 是一次自动类型转换,可以自动完成
 *
 *      引用数据类型自动类型转换的特殊称呼:
 *          从继承的方向上来说,子类引用 转换成 父类引用,是向上的
 *          所以引用数据类型自动类型转换也称之为"向上转型"
 *
 *          向上转型自动完成,无需程序员写额外代码.
 *          向上转型是一定可以成功的,因为子类"is-a"父类,子类就可以当成父类去使用
 *
 *
 * 4.引用数据类型的强制类型转换:
 *      条件/什么情况下发生:
 *          父类引用 转换成 子类引用 是一次强制类型转换,需要特殊语法完成
 *          强转后类型的类名 对象名 = (强转后类型的类名)对象名;
 *
 *      能否成功呢?/成功的条件是什么?
 *          父到子,相当于把父类当成子类去使用,这几乎是不可能的,因为子类往往比父类强大
 *          所以引用数据类型的强制类型转换,要想成功进行转换,条件很苛刻
 *          如果强转失败,会导致程序报错终止执行
 *          抛出异常ClassCastException
 *
 *          关于它成功的具体条件,后面再讲.
 *
 *      引用数据类型强制类型转换的特殊称呼: 向下转型
 *          从继承的方向上来说,父类引用 转换成 子类引用,是向下的
 *
 *
 * @since 10:18
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // 自动类型转换
        Animal a = new Cat();
        /*
            以上代码,实际上可以拆开成下面的形式
            最开始Cat引用是Cat类型
            最后变成了Animal类型
            引用的类型发生了改变,这就是引用数据类型的类型转换
            这个过程没有写任何额外代码,自动完成类型转换
                是引用数据类型变量的自动类型转换
          */
        Cat c = new Cat();
        Animal ac;
        ac = c;
        System.out.println("----------------------");
        Animal ani = new Animal();
        Cat cc = null;
        // 父类引用到子类引用,是强转,需要特殊语法
        // 父类对象是不可能直接当子类使用的,下面的强转语句是会报错,抛出异常的.
        cc = (Cat) ani;
    }
}

class Animal {
}

class Cat extends Animal {

}